// 02_data_types.rs
// 演示 Rust 中的数据类型（标量与复合）

// 将原来的 main 函数改为公共的 run 函数
pub fn run() {
    // 1. 标量类型（Scalar Types）
    // 标量类型表示单个值
    
    // a. 整数类型
    let integer_u8: u8 = 255; // 无符号8位整数（0到255）
    let integer_i32: i32 = -42; // 有符号32位整数
    let integer_u64: u64 = 1_000_000; // 无符号64位整数
    let integer_isize: isize = 10; // 与架构相关的有符号整数
    let integer_usize: usize = 100; // 与架构相关的无符号整数（常用于索引）
    
    println!("整数类型示例:");
    println!("u8: {}", integer_u8);
    println!("i32: {}", integer_i32);
    println!("u64: {}", integer_u64);
    println!("isize: {}", integer_isize);
    println!("usize: {}", integer_usize);
    
    // b. 浮点数类型
    let float_f32: f32 = 3.14; // 32位浮点数
    let float_f64: f64 = 2.71828; // 64位浮点数（默认）
    
    println!("\n浮点数类型示例:");
    println!("f32: {}", float_f32);
    println!("f64: {}", float_f64);
    
    // c. 布尔类型
    let boolean_true: bool = true;
    let boolean_false: bool = false;
    
    println!("\n布尔类型示例:");
    println!("true: {}", boolean_true);
    println!("false: {}", boolean_false);
    
    // d. 字符类型
    // 字符类型在 Rust 中占用4字节，表示 Unicode 标量值
    let char_a: char = 'a';
    let char_heart: &str = "❤️";
    let char_cn: char = '中';
    let char_special: char = '\u{1F600}'; // 使用 Unicode 码点
    
    println!("\n字符类型示例:");
    println!("普通字符: {}", char_a);
    println!("表情符号: {}", char_heart);
    println!("中文字符: {}", char_cn);
    println!("Unicode 码点字符: {}", char_special);
    
    // 2. 复合类型（Compound Types）
    // 复合类型可以组合多个值
    
    // a. 元组（Tuple）
    // 元组可以包含不同类型的值，长度固定
    let tuple_empty: () = (); // 空元组
    let tuple_mixed: (i32, f64, bool, char) = (42, 3.14, true, 'x');
    
    println!("\n元组类型示例:");
    println!("空元组: {:?}", tuple_empty);
    println!("混合类型元组: {:?}", tuple_mixed);
    
    // 访问元组中的元素
    println!("元组的第一个元素: {}", tuple_mixed.0);
    println!("元组的第二个元素: {}", tuple_mixed.1);
    
    // 解构元组
    let (x, y, z, w) = tuple_mixed;
    println!("解构后的元素: x={}, y={}, z={}, w={}", x, y, z, w);
    
    // b. 数组（Array）
    // 数组中的所有元素必须是相同类型，长度固定
    let array_i32: [i32; 5] = [1, 2, 3, 4, 5];
    let array_same: [i32; 4] = [10; 4]; // 所有元素都是10
    
    println!("\n数组类型示例:");
    println!("整数数组: {:?}", array_i32);
    println!("相同元素数组: {:?}", array_same);
    
    // 访问数组元素
    println!("数组的第一个元素: {}", array_i32[0]);
    println!("数组的最后一个元素: {}", array_i32[4]);
    
    // 获取数组长度
    println!("数组长度: {}", array_i32.len());
    
    // 注意：尝试访问超出数组范围的索引会导致运行时错误
    // println!("越界访问: {}", array_i32[10]); // 这会导致程序崩溃
}